/*
 * @Author: wwssaabb
 * @Date: 2021-08-14 10:51:21
 * @LastEditTime: 2021-08-14 16:10:06
 * @FilePath: \ts_demo\demo\base_demo.ts
 */

/* 
  定义类型有两种方式，interface、type（类型别名）
  interface只能定义对象类型
  type可以声明组合类型，交叉类型和原始类型
  相同点：都可以描述一个对象或函数
*/
interface Eg1 {
  name: string;
  age: number; //属性后面的？表示属性可有可无，不约束
  sex?: number; //属性后面的？表示属性可有可无，不约束
}
const user1: Eg1 = {
  name: "张三",
  age: 26,
};
console.log(user1);

type User = typeof user1; //typeof 获取到user1的type类型
const user2: User = {
  name: "李四",
  age: 26,
};

//接口约束函数传参以及返回值
interface Fun1 {
  (name: string, age: number): void;
}
const say: Fun1 = function (name: string, age: number): void {
  console.log(`我叫${name},今年${age}`);
};
say("张三", 26);

type Fun2 = (name: string, age: number) => void;
const say1: Fun2 = (name: string, age: number): void => {
  console.log(`我叫${name},今年${age}`);
};
say1("李四", 26);

/* 
  相同点：
    都能允许扩展（extends）
    并且不互相独立，可以互相继承，不过语法不同
*/
//interface extends interface
interface Name1 {
  name: string;
}
interface User1 extends Name1 {
  age: number;
}

//type extends type
type Name2 = {
  name: string;
};
type User2 = Name2 & { age: number };

//interface extends type
type Name3 = {
  name: string;
};
interface User3 extends Name3 {
  age: number;
}

//type extends interface
interface Name4 {
  name: string;
}
type User4 = Name4 & { age: number };

/* 
  不同点：
    1.type可以声明基本类型别名、联合类型、元组等类型
    2.type语句中还可以使用typeof获取实例的类型进行赋值
*/
//基本类型别名
type Name5 = { name: string };

//联合类型
interface Dog {
  wang(): void;
}
interface Cat {
  miao(): void;
}
type Pet = Dog | Cat;

//具体定义数组中每个位置的类型
type PetLsit = [Dog | Cat];

//不同点2，type语句中还可以使用typeof获取实例的类型进行赋值
let obj = { name: "张三", age: 26 };
type T1 = typeof obj;

//不同点3，interface可以进行声明合并

interface User5{
  name:string
  age:number
}
interface User5{
  sex:string
}

export {}